package com.zrkizzy.thread.practice;

import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import static java.util.concurrent.Executors.newFixedThreadPool;

/**
 * 动态线程池练习题
 * <p>
 *     <b>任务：</b>实现一个线程池，可以动态调整线程数量。<br/>
 *     <b>需求：</b>当任务多时，增加线程数，当任务较少时，减少线程数。<br/>
 * </p>
 *
 * @author zhangrongkang
 * @since 2023/10/16
 */
public class ThreadPoolPractice {

    public static void main(String[] args) throws InterruptedException {
        // 创建初始线程数为2，最大线程数为4的线程池
        ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) newFixedThreadPool(2);

        // 提交任务到线程池
        for (int i = 0; i < 20; i++) {
            // 当前任务数
            final int taskNumber = i;
            // 线程池执行任务
            threadPoolExecutor.execute(() -> {
                System.out.println("线程池执行的任务号为：" + taskNumber + "  " + Thread.currentThread().getName());

                try {
                    // 线程休息1000ms
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });
        }

        /// 动态调整线程数量
        // 增加核心线程数
        threadPoolExecutor.setCorePoolSize(4);
        // 增加最大线程数
        threadPoolExecutor.setMaximumPoolSize(4);

        // 等待所有任务执行完成
        threadPoolExecutor.shutdown();

        System.out.println("线程池是否关闭：" + threadPoolExecutor.awaitTermination(1, TimeUnit.HOURS));
    }

}
